perm filename PRIM[BNF,JRA] blob sn#089195 filedate 1974-02-27 generic text, type T, neo UTF8
	TITLE PRIM
;ACCUMULATOR DEFINITIONS
P←14
F←15
FF←16

A←1
B←2
C←3
D←4
T←6
R←13
TT←7
NIL←0
INUM0←577777


;LISP FUNCTION CALL UUO'S
OPDEF CALL [34B8]
OPDEF JCALL [35B8]
OPDEF CALLF [36B8]
OPDEF JCALLF [37B8]

EXTERNAL TRUTH,INTERN,CHRCT,FLATSIZE,ATOM,SCAN,SCNVAL
EXTERNAL NILX,STAR,READP1


NILRET:	MOVEI A,NIL
	POPJ P,

TRET:	MOVEI A,TRUTH
	POPJ P,


LOSE:	PUSHJ P,UNWIND
NILXR:	MOVEI A,NILX	;NILX IS *NIL*
	POPJ P,


REDPTR:	0

INTERNAL XXTRY,ATM

ATM:	PUSHJ P,LOOK
	MOVEI A,INUM0+3
	CAIN A,(B)	;IS IT A DELIMITER?
	JRST UNWIND	;YES, LOSE
	JRST TRY2	;NO, IT IS AN ATOM -- ACCEPT IT

XXTRY:	PUSHJ P,LOOK
	CAIE A,(B)
	JRST UNWIND
TRY2:	SOS BKUPTR
	AOS REDPTR
	MOVEM B,@REDPTR
	JRST TRET

INTERNAL ISIT,ISITN
EXTERNAL ACONS
ISITN: SETOM ISFLG#
	JRST .+2
ISIT:	SETZM ISFLG#
	JUMPE A,NILRET	;IT ISN'T
	PUSH P,A	;MAYBE
	PUSHJ P,LOOK
	HLRZ A,B
	HRRZ C,B
	CAIN C,INUM0+0
	JRST ISIT1
	CAIN C,INUM0+1
	JRST ISIT4	;LOSE ON STRINGS
	CAIN C,INUM0+2
	JRST ISIT1	;TAKE NUMBERS
	CAIE C,INUM0+3
	JRST ISIT4 ;LOSE AGAIN
	PUSH P,B
	PUSHJ P,ACONS-7	;H.S. TO ASCII
	PUSHJ P,INTERN
	POP P,B
ISIT1:	POP P,D	;NOW MEMQ IT
	MOVS C,(D)
	CAIN A,(C)
	JRST ISIT2	;IT IS
	HLRZ D,C
	JUMPN D,ISIT1+1
	SKIPN ISFLG
	JRST UNWIND
ISIT3:	SOS BKUPTR
	AOS REDPTR
	MOVEM B,@REDPTR
	POPJ P,0
ISIT4:	POP P,A
	JRST UNWIND
ISIT2:	SKIPE ISFLG
	JRST UNWIND
	JRST ISIT3

LOOK:	SKIPE B,@BKUPTR
	POPJ P,
	PUSH P,A
	PUSHJ P,SCAN
	CAIN A,INUM0
	JRST	[MOVE A,SCNVAL
		PUSHJ P,INTERN
		MOVSS A
		HRRI A,INUM0
		JRST LOOK2]
	HRL A,SCNVAL
LOOK2:	AOS BKUPTR
	MOVEM A,@BKUPTR
	MOVE B,A
	POP P,A
	POPJ P,

INTERNAL SPWDX,CHX
SPWDX:	HRLI A,INUM0
	JRST .+2
CHX:	HRLI A,INUM0+3
	MOVSS A
	PUSHJ P,LOOK
	CAME A,B	;IS BOTH TYPE AND VALUE THE SAME?
	JRST UNWIND	;NO, LOSE
	JRST TRY2	;YES, TAKE IT


INTERNAL STK,PDLSET

STK:	MOVNI A,-INUM0(A)	;THIS SHOULD BE NEGATIVE NUMVAL
	ADD A,REDPTR	;0 IS THE TOP OF THE STACK
	HLRZ A,(A)	;THE SEMANTIC VALUE IS IN THE LEFT HALF
	POPJ P,

;PDLSET INITIALIZES PDLPTR TO POINT TO A LISP ARRAY 

PDLSET:	ADDI B,12
	ADDI A,12	;GET ADDRESSES OF 1ST ARRAY WORDS
	MOVEM A,REDPTR
	MOVEM B,BKUPTR
	SETZM @BKUPTR
	JRST MARK



INTERNAL REDUCE
;REDUCE RESETS TO STACK TO BELOW THE MARK
;A CONTAINS SYNTACTIC VALUE, B CONTAINS SEMANTIC VALUE
REDUCE:	PUSHJ P,UNMARK	;RESET STACK TO BELOW MARK
	CAIN B,NILX	;IS SEMANTIC VALUE *NIL*?
	JRST UNWIND	;YES, UNWIND STACK TO PREVIOUS MARK
	HRL A,B	;NO, CONSTRUCT REDUCTION WORD
	AOS REDPTR
	MOVEM A,@REDPTR		;PUSH IT ONTO REDUCTION STACK
	JRST TRET

UNMARK:	HRRO T,REDMRK#
	POP T,REDMRK	;RESTORE REDMRK TO ITS PREVIOUS VALUE
	HRRZM T,REDPTR	;RESTORE REDPTR TO BELOW REDMRK
	POPJ P,

MARK:	HRRZ T,REDPTR
	PUSH T,REDMRK	;SAVE REDMRK
	HRROM T,REDMRK	;REMEMBER WHERE REDMRK SAVED
	HRRZM T,REDPTR	;UPDATE REDPTR
	JRST NILRET	;PDL OVERFLOW CHECKING HERE?

UNWIND:	HRRO T,REDPTR
	SKIPA TT,BKUPTR#
UNWIN2:	PUSH TT,A
	POP T,A		;GET A WORD FROM REDUCTION PDL
	TLC A,-1
	TLCE A,-1
	JRST UNWIN2	;IF NOT A MARK, TRANSFER IT TO BACKUP PDL
	PUSH T,A	;FOUND A MARK, RESTORE IT
	HRRZM T,REDPTR	;AND UPDATE POINTERS
	HRRZM TT,BKUPTR
	JRST NILRET	;PDL OVERFLOW CHECKING HERE?




ISSTR:	MOVE B,@BKUPTR	;GET TOP OF BACKUP STACK
	CAIE A,(B)	;IS IT THE PROPER TYPE?
	JRST MARK	;NO, PROCEED WITH RULE
	SOS BKUPTR	;YES, TRANSFER IT TO REDUCTION PDL
	AOS REDPTR
	MOVEM B,@REDPTR
	JRST TRET



INTERNAL LRR,NLRR

;LRR--LEFT RECURSIVE RULE
;A CONTAINS NAME OF RULE
;B CONTAINS NON LEFT-RECURSIVE FUNCTION
;C CONTAINS LEFT-RECURSIVE FUNCTION

LRR:	PUSH P,A	;SAVE NAME
	PUSH P,B	;SAVE FUNCTIONS
	PUSH P,C
	PUSHJ P,ISSTR	;IS A REDUCTION ALREADY MADE?
	JUMPN A,LRRXIT	;YES
	CALLF @-1(P)	;NO, EXECUTE NON LEFT-RECURSIVE FUNCTION
	MOVEM A,-1(P)	;SAVE SEMANTIC VALUE
LRRL:	CAIN A,NILX	;IS IT *NIL*?
	JRST LRRRET	;YES
	MOVEM A,-1(P)	;NO, SAVE SEMANTIC VALUE
	PUSHJ P,UNMARK	;RESET STACK TO MARK
	PUSHJ P,MARK
	HRRZ A,-1(P)	;GET SEMANTIC VALUE
	CALLF 1,@(P)	;EXECUTE LEFT-RECURSIVE FUNCTION
	JRST LRRL	;CONTINUE UNTIL FAILURE

LRRRET:	MOVE B,-1(P)	;GET FINAL SEMANTIC VALUE
	MOVE A,-2(P)	;GET NAME OF RULE(SYNTACTIC VALUE)
	PUSHJ P,REDUCE	;PERFORM THE REDUCTION

LRRXIT:	SUB P,[XWD 3,3]	;RESYNC THE STACK
	POPJ P,

;NLRR---NON LEFT-RECURSIVE RULE
;A CONTAINS NAME OF RULE
;B CONTAINS FUNCTION

NLRR:	PUSH P,A	;SAVE NAME
	PUSH P,B	;SAVE FUNCTION
	PUSHJ P,ISSTR	;IS THE REDUCTION ALREADY MADE?
	JUMPN A,NLRXIT	;YES
	POP P,A	;NO, GET FUNCTION
	CALLF (A)	;CALL FUNCTION
	POP P,B	;GET SYNTACTIC VALUE
	EXCH A,B
	JRST REDUCE	;PERFORM THE REDUCTION

NLRXIT:	SUB P,[XWD 2,2]	;RESYNC STACK
	POPJ P,




INTERNAL PPOS,LOC,FLATC
EXTERNAL TYO,CHRCT,TERPRI,CHCT,LINL

PPOS:	SUBI A,INUM0
	JUMPE A,TERPRI
	MOVEI C,(A)
	MOVE A,LINL
	SUB A,CHCT
	CAMGE C,A
	PUSHJ P,TERPRI
	JRST PPOS2

PPOS22:	MOVEI A,11
	PUSHJ P,TYO
PPOS2:	MOVE B,LINL
	SUB B,CHCT
	CAIL C,8(B)
	JRST PPOS22
	SUB C,B
	MOVEI A,40
	JRST .+2
	PUSHJ P,TYO
	SOJGE C,.-1
	POPJ P,

LOC:	MOVE A,LINL
	SUB A,CHCT
	ADDI A,INUM0
	POPJ P,

FLATC:	HRROI R,FLATSIZE+5
	HLLZS FLATSIZE+3
	JRST FLATSIZE+2



INTERNAL OUTRULE,MATCH

PDLPTR←←REDPTR
OUTRULE:	MOVE T,PDLPTR
	MOVNI A,-INUM0(A)	;SHOULD BE NEGATIVE NUMVAL
	ADDI A,(T)
	PUSH P,A
	PUSH T,(A)
	PUSH T,PDLMARK#
	MOVEM T,PDLMARK
	MOVEM T,PDLPTR
	CALLF (B)
	MOVE T,PDLMARK
	POP T,PDLMARK
	POP T,B
	POP P,B	;SHOULD BE PTR TO X.
	MOVEM T,PDLPTR
	JUMPN A,OR1
	MOVE T,PDLMARK
	MOVEM T,PDLPTR
	POPJ P,

OR1:	HRLZM A,(B)
	POPJ P,


MATCH:	MOVE T,PDLMARK
	MOVE B,A
	HLRZ A,-1(T)
	MOVEM P,PSAV#
	PUSHJ P,MAT
	MOVEM T,PDLPTR
	JRST TRET

MAT:	CAIN B,STAR
	JRST MAT1
	PUSH P,A
	PUSH P,B
	CALL 1,ATOM
	JUMPN A,MAT2
	MOVE A,(P)
	CALL 1,ATOM
	JUMPN A,MAT2
	HLRZ A,@-1(P)
	HLRZ B,@(P)
	PUSHJ P,MAT
	HRRZ A,@-1(P)
	HRRZ B,@(P)
	SUB P,[XWD 2,2]
	JRST MAT

MAT1:	HRLZS A
	PUSH T,A
	POPJ P,

MAT2:	POP P,B
	POP P,A
	CAMN A,B
	POPJ P,

MAT3:	MOVE P,PSAV
	JRST NILRET



	END